#include "task_manager.h"

namespace wilson::sys
{
    ::std::shared_ptr<normal_task_mgr> 
    normal_task_mgr::make_task_mgr()
    {
        auto ret = ::std::make_shared<normal_task_mgr>();
        ret->registe_globally();
        return ret;
    }

    ::std::shared_ptr<normal_task_mgr> 
    normal_task_mgr::get_from_global()
    {
        TMR auto& tmr = get_global_TMR<normal_task_mgr>();
        auto ret = tmr.next();
        if (ret == nullptr)
        {
            return normal_task_mgr::make_task_mgr();
        }
        return ret;
    }

    void normal_task_mgr::registe_globally()
    {
        get_global_TMR<normal_task_mgr>()
            .registe(shared_from_this());
    }

    resumable normal_task_mgr::get_task()
    {
        resumable ret{};
        (void)ntm_queue.try_dequeue(ret);
        return ret;
    }

    void normal_task_mgr::enqueue_task(resumable r)
    {
        ntm_queue.enqueue(::std::move(r));
    }

    resumable normal_task_mgr::get_task(moodycamel::ConsumerToken& t)
    {
        resumable ret{};
        (void)ntm_queue.try_dequeue(t, ret);
        return ret;
    }

    void normal_task_mgr::enqueue_task(moodycamel::ProducerToken& t, resumable r)
    {
        ntm_queue.enqueue(t, ::std::move(r));
    }
}
